package com.tencent.wxpay.protocol.request;

import com.tencent.wxpay.common.Signature;
import com.tencent.wxpay.protocol.model.FeeType;

import java.io.Serializable;

/**
 * 申请退款接口请求数据对象
 */
public class RefundReqData extends BaseReqData implements Serializable {

    private static final long serialVersionUID = 955305335023628066L;
    /**
     * 设备号
     * 必填：否
     * 描述：终端设备号
     */
    private String device_info;
    /**
     * 微信订单号
     * 必填：与 out_trade_no 二选一
     * 描述：微信生成的订单号，在支付通知中有返回
     */
    private String transaction_id;
    /**
     * 商户订单号
     * 必填：与 transaction_id 二选一
     * 描述：商户侧传给微信的订单号
     */
    private String out_trade_no;
    /**
     * 商户退款单号
     * 必填：是
     * 描述：商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔
     */
    private String out_refund_no;
    /**
     * 订单金额
     * 必填：是
     * 描述：订单总金额，单位为分，只能为整数，详见<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2">支付金额</a>
     */
    private int total_fee = 0;
    /**
     * 退款金额
     * 必填：是
     * 描述：退款总金额，订单总金额，单位为分，只能为整数，详见<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2">支付金额</a>
     */
    private int refund_fee = 0;
    /**
     * 货币种类
     * 必填：否
     * 描述：货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2">货币类型</a>
     */
    private String refund_fee_type;
    /**
     * 操作员
     * 必填：是
     * 描述：操作员帐号, 默认为商户号
     */
    private String op_user_id;
    /**
     * 退款资金来源
     * 必填：否
     * 描述：仅针对老资金流商户使用
     * REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款（默认使用未结算资金退款）
     * REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
     */
    private String refund_account;

    /**
     * 请求申请退款接口构造方法(所有必填项)
     *
     * @param transactionID 是微信系统为每一笔支付交易分配的订单号，通过这个订单号可以标识这笔交易，它由支付订单API支付成功时返回的数据里面获取到。建议优先使用
     * @param outTradeNo    商户系统内部的订单号,transaction_id 、out_trade_no 二选一，如果同时存在优先级：transaction_id>out_trade_no
     * @param outRefundNo   商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔
     * @param totalFee      订单总金额，单位为分
     * @param refundFee     退款总金额，单位为分,可以做部分退款
     * @param opUserID      操作员帐号, 默认为商户号
     */
    public RefundReqData(String transactionID, String outTradeNo, String outRefundNo, int totalFee, int refundFee, String opUserID) {
        super();
        this.transaction_id = transactionID;
        this.out_trade_no = outTradeNo;
        this.out_refund_no = outRefundNo;
        this.total_fee = totalFee;
        this.refund_fee = refundFee;
        this.op_user_id = opUserID;
        setSign(Signature.getSign(toMap(this)));
    }

    /**
     * 请求申请退款接口构造方法(所有必填项，包括仅针对老资金流商户使用的退款资金来源项)
     *
     * @param transactionID 是微信系统为每一笔支付交易分配的订单号，通过这个订单号可以标识这笔交易，它由支付订单API支付成功时返回的数据里面获取到。建议优先使用
     * @param outTradeNo    商户系统内部的订单号,transaction_id 、out_trade_no 二选一，如果同时存在优先级：transaction_id>out_trade_no
     * @param outRefundNo   商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔
     * @param totalFee      订单总金额，单位为分
     * @param refundFee     退款总金额，单位为分,可以做部分退款
     * @param opUserID      操作员帐号, 默认为商户号
     * @param refundAccount 退款资金来源,仅针对老资金流商户使用 REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款（默认使用未结算资金退款）REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
     */
    public RefundReqData(String transactionID, String outTradeNo, String outRefundNo, int totalFee, int refundFee, String opUserID, String refundAccount) {
        super();
        this.transaction_id = transactionID;
        this.out_trade_no = outTradeNo;
        this.out_refund_no = outRefundNo;
        this.total_fee = totalFee;
        this.refund_fee = refundFee;
        this.op_user_id = opUserID;
        this.refund_account = refundAccount;
        setSign(Signature.getSign(toMap(this)));
    }

    /**
     * 请求申请退款接口构造方法(所有项，包括非必填项)
     *
     * @param transactionID 是微信系统为每一笔支付交易分配的订单号，通过这个订单号可以标识这笔交易，它由支付订单API支付成功时返回的数据里面获取到。建议优先使用
     * @param outTradeNo    商户系统内部的订单号,transaction_id 、out_trade_no 二选一，如果同时存在优先级：transaction_id>out_trade_no
     * @param outRefundNo   商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔
     * @param totalFee      订单总金额，单位为分
     * @param refundFee     退款总金额，单位为分,可以做部分退款
     * @param opUserID      操作员帐号, 默认为商户号
     * @param deviceInfo    微信支付分配的终端设备号，与下单一致
     * @param refundFeeType 货币类型，符合ISO 4217标准的三位字母代码，默认为CNY（人民币）
     */
    public RefundReqData(String transactionID, String outTradeNo, String outRefundNo, int totalFee, int refundFee, String opUserID, String deviceInfo, FeeType refundFeeType) {
        super();
        this.device_info = deviceInfo;
        this.transaction_id = transactionID;
        this.out_trade_no = outTradeNo;
        this.out_refund_no = outRefundNo;
        this.total_fee = totalFee;
        this.refund_fee = refundFee;
        this.refund_fee_type = refundFeeType.toString();
        this.op_user_id = opUserID;
        setSign(Signature.getSign(toMap(this)));
    }

    /**
     * 请求申请退款接口构造方法(所有项，包括非必填项，包括仅针对老资金流商户使用的退款资金来源项)
     *
     * @param transactionID 是微信系统为每一笔支付交易分配的订单号，通过这个订单号可以标识这笔交易，它由支付订单API支付成功时返回的数据里面获取到。建议优先使用
     * @param outTradeNo    商户系统内部的订单号,transaction_id 、out_trade_no 二选一，如果同时存在优先级：transaction_id>out_trade_no
     * @param outRefundNo   商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔
     * @param totalFee      订单总金额，单位为分
     * @param refundFee     退款总金额，单位为分,可以做部分退款
     * @param opUserID      操作员帐号, 默认为商户号
     * @param deviceInfo    微信支付分配的终端设备号，与下单一致
     * @param refundFeeType 货币类型，符合ISO 4217标准的三位字母代码，默认为CNY（人民币）
     * @param refundAccount 退款资金来源,仅针对老资金流商户使用 REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款（默认使用未结算资金退款）REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
     */
    public RefundReqData(String transactionID, String outTradeNo, String outRefundNo, int totalFee, int refundFee, String opUserID, String deviceInfo, FeeType refundFeeType, String refundAccount) {
        super();
        this.device_info = deviceInfo;
        this.transaction_id = transactionID;
        this.out_trade_no = outTradeNo;
        this.out_refund_no = outRefundNo;
        this.total_fee = totalFee;
        this.refund_fee = refundFee;
        this.refund_fee_type = refundFeeType.toString();
        this.op_user_id = opUserID;
        this.refund_account = refundAccount;
        setSign(Signature.getSign(toMap(this)));
    }

    public String getDevice_info() {
        return device_info;
    }

    public void setDevice_info(String device_info) {
        this.device_info = device_info;
    }

    public String getTransaction_id() {
        return transaction_id;
    }

    public void setTransaction_id(String transaction_id) {
        this.transaction_id = transaction_id;
    }

    public String getOut_trade_no() {
        return out_trade_no;
    }

    public void setOut_trade_no(String out_trade_no) {
        this.out_trade_no = out_trade_no;
    }

    public String getOut_refund_no() {
        return out_refund_no;
    }

    public void setOut_refund_no(String out_refund_no) {
        this.out_refund_no = out_refund_no;
    }

    public int getTotal_fee() {
        return total_fee;
    }

    public void setTotal_fee(int total_fee) {
        this.total_fee = total_fee;
    }

    public int getRefund_fee() {
        return refund_fee;
    }

    public void setRefund_fee(int refund_fee) {
        this.refund_fee = refund_fee;
    }

    public String getOp_user_id() {
        return op_user_id;
    }

    public void setOp_user_id(String op_user_id) {
        this.op_user_id = op_user_id;
    }

    public String getRefund_fee_type() {
        return refund_fee_type;
    }

    public void setRefund_fee_type(FeeType refund_fee_type) {
        this.refund_fee_type = refund_fee_type.toString();
    }

    public String getRefund_account() {
        return refund_account;
    }

    public void setRefund_account(String refund_account) {
        this.refund_account = refund_account;
    }
}
